Criminaliteit en Welvaart#

Student names: Chris Dukker, David Snoeks, Ryan Rodrigus, Jason Roes

Team number: D2

Hide code cell source
# Load image from link
url = 'https://ccv-secondant.nl/fileadmin/w/secondant_nl/platform/illustraties/Internationaal.jpg'

# Display image from URL with smaller size and subtitle
from IPython.display import Image, display

# Set the desired image width and height
width = 600
height = 300

# Set the subtitle text
subtitle = "© CCV / Hans Sprangers"

# Create an Image instance with the URL
image = Image(url=url, width=width, height=height)

# Display the image and subtitle
display(image)
print(subtitle)
© CCV / Hans Sprangers

Introduction#

In Europa is er een verschil in welvaart tussen landen. Zo zijn er sommige landen met meer gelijkheid en landen die meer totaal inkomen hebben. Maar er is ook een verschil in criminaliteit. Sommige landen hebben meer totale criminaliteit en in sommige landen gebeuren bepaalde misdaden meer dan anderen. De vraag is alleen of er ook een verband is tussen hoe welvarend een land is en hoeveel misdaden en ook welke misdaden er gebeuren.

Met deze data story gaan we onderzoeken of ongelijkheid en het gemiddelde inkomen per persoon invloed heeft op de hoeveelheid misdaden die er gebeuren, en of het invloed heeft op specifieke misdaden als moord, verkrachting, diefstal, fraude en drugsgebruik. Dit doen we met behulp van de GINI (een maatstaf voor inkomens- of vermogenongelijkheid) en de economie en groei dataset van World Bank Open Data en de misdaadstatistieken dataset van de Europese Commissie.

Volgens De Courson & Nettle (2021) is voor mensen met een laag inkomen en kapitaal het soms de optimale strategie om misdaden te plegen, voornamelijk misdaden waarmee geld valt te verdienen. Hoewel er het risico is om gepakt te worden, is wat ze krijgen als ze niet gepakt worden het heel erg waard. Ook omdat ze niet veel hoop voor de rest hebben en ook niet veel te verliezen hebben, voelen ze dat dat hun beste kans is om uit hun huidige leven te ontsnappen.

Dataset and Preprocessing#

Zie het bestand preprocess.ipynb

Your First Perspective#

Verband diefstal, fraude en ongelijkheid#

Fraude en diefstal hebben veel met elkaar te maken: ze gaan namelijk allebei over het stelen van geld van iemand anders.

At solmen va esser necessi far uniform grammatica, pronunciation e plu sommun paroles. Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari quam ti del coalescent lingues. Li nov lingua franca va esser plu simplic e regulari quam li existent Europan lingues. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante.

Hide code cell source
import plotly.graph_objects as go
import pandas as pd

# Read the data from table2.csv
df2 = pd.read_csv('table2.csv')

# Initialize a figure
fig2 = go.Figure()

# Create the first line
fig2.add_trace(
    go.Scatter(
        x=df2["Jaartal"], 
        y=df2["Workers involved (x 1,000)"],
        mode='lines+markers',
        line=dict(color='#00a1cd', width=2),
        marker=dict(color='#00a1cd', size=5),
        name="Workers involved",
        hovertemplate='<b>%{x}</b><br>Workers involved: <b>%{y} thousand</b> <extra></extra>'
    )
)

# Create the second line
fig2.add_trace(
    go.Scatter(
        x=df2["Jaartal"], 
        y=df2["Working days lost (x 1,000)"],
        mode='lines+markers',
        line=dict(color='#0058b8', width=2),
        marker=dict(color='#0058b8', size=5),
        name="Working days lost",
        hovertemplate='<b>%{x}</b><br>Working days lost: <b>%{y} thousand</b> <extra></extra>'
    )
)

# Customize the plot layout
fig2.update_layout(
    plot_bgcolor='white',
    xaxis=dict(title='Years'),
    yaxis=dict(title=''),  # Remove y-axis tick labels
    legend=dict(title='', orientation='h', yanchor='bottom', y=-0.3, xanchor='right', x=0.3),  # Update legend settings
    title="Number of workers involved and working<br>days lost during strikes (in thousand)",
    height=500
)

# Add horizontal lines at y = 0, 100, 200, 300, 400, and 500
y_values = [0, 100, 200, 300, 400, 500]
for y in y_values:
    fig2.add_shape(
        type='line',
        x0=min(df2['Jaartal']),
        x1=max(df2['Jaartal']),
        y0=y,
        y1=y,
        line=dict(color='black'),
        line_width=0.5
    )

# Show the plot
fig2.show()
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[2], line 5
      2 import pandas as pd
      4 # Read the data from table2.csv
----> 5 df2 = pd.read_csv('table2.csv')
      7 # Initialize a figure
      8 fig2 = go.Figure()

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
   1013 kwds_defaults = _refine_defaults_read(
   1014     dialect,
   1015     delimiter,
   (...)   1022     dtype_backend=dtype_backend,
   1023 )
   1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:620, in _read(filepath_or_buffer, kwds)
    617 _validate_names(kwds.get("names", None))
    619 # Create the parser.
--> 620 parser = TextFileReader(filepath_or_buffer, **kwds)
    622 if chunksize or iterator:
    623     return parser

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1620, in TextFileReader.__init__(self, f, engine, **kwds)
   1617     self.options["has_index_names"] = kwds["has_index_names"]
   1619 self.handles: IOHandles | None = None
-> 1620 self._engine = self._make_engine(f, self.engine)

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1880, in TextFileReader._make_engine(self, f, engine)
   1878     if "b" not in mode:
   1879         mode += "b"
-> 1880 self.handles = get_handle(
   1881     f,
   1882     mode,
   1883     encoding=self.options.get("encoding", None),
   1884     compression=self.options.get("compression", None),
   1885     memory_map=self.options.get("memory_map", False),
   1886     is_text=is_text,
   1887     errors=self.options.get("encoding_errors", "strict"),
   1888     storage_options=self.options.get("storage_options", None),
   1889 )
   1890 assert self.handles is not None
   1891 f = self.handles.handle

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/common.py:873, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
    868 elif isinstance(handle, str):
    869     # Check whether the filename is to be opened in binary mode.
    870     # Binary mode does not support 'encoding' and 'newline'.
    871     if ioargs.encoding and "b" not in ioargs.mode:
    872         # Encoding
--> 873         handle = open(
    874             handle,
    875             ioargs.mode,
    876             encoding=ioargs.encoding,
    877             errors=errors,
    878             newline="",
    879         )
    880     else:
    881         # Binary mode
    882         handle = open(handle, ioargs.mode)

FileNotFoundError: [Errno 2] No such file or directory: 'table2.csv'

Figure 2: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.

Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante.

The Second Argument of Your First Perspective#

It va esser tam simplic quam Occidental in fact, it va esser Occidental. A un Angleso it va semblar un simplificat Angles, quam un skeptic Cambridge amico dit me que Occidental es. Li Europan lingues es membres del sam familie. Lor separat existentie es un myth. Por scientie, musica, sport etc, litot Europa usa li sam vocabular. Li lingues differe solmen in li grammatica, li pronunciation e li plu commun vocabules. Omnicos directe al desirabilite de un nov lingua franca: On refusa continuar payar custosi traductores. At solmen va esser necessi far uniform grammatica, pronunciation e plu sommun paroles.

Hide code cell source
import plotly.graph_objects as go
import pandas as pd

# Read the data from table3.csv
df3 = pd.read_csv('table3.csv')

# Create an empty figure
fig3 = go.Figure()

# Define a list of tuples with the variable names and their respective colors
variables = [("Collective agreement (CAO) (% (very) satisfied)", '#00a1cd'), 
             ("Salary (% (very) satisfied)", '#0058b8')]

# Loop over the variables to add a trace for each one
for var, color in variables:
    name = var.split("(")[0].strip()
    fig3.add_trace(go.Bar(
        y=df3["Bedrijfstak"],
        x=df3[var],
        name=name,
        orientation='h',
        hovertemplate=f'%{{y}}<br>{name}: <b>%{{x}}% (very) satisfied</b><extra></extra>',
        marker_color=color
    ))

# Customize the plot layout
fig3.update_layout(
    plot_bgcolor='white',
    title="Percentage of employees satisfied with<br>collective agreement and salary (15-74 yrs), 2022",
    xaxis=dict(title='', title_standoff=10, automargin=True, range=[0, 100]),  # Hide the original x-axis title
    yaxis=dict(title='', autorange="reversed", automargin=True),  # Remove y-axis title and add more whitespace between items
    legend=dict(title='', orientation='h', yanchor='bottom', y=-0.3, xanchor='right', x=0.04),  # Update legend settings
    barmode='group',  # Stack bars instead of placing them side-by-side
    height=600,
    annotations=[dict(x=1.015, y=-0.15, xref='paper', yref='paper', showarrow=False, text="(%) very satisfied")]  # Add annotation as x-axis title
)

# Show the plot
fig3.show()
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[1], line 5
      2 import pandas as pd
      4 # Read the data from table3.csv
----> 5 df3 = pd.read_csv('table3.csv')
      7 # Create an empty figure
      8 fig3 = go.Figure()

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
   1013 kwds_defaults = _refine_defaults_read(
   1014     dialect,
   1015     delimiter,
   (...)   1022     dtype_backend=dtype_backend,
   1023 )
   1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:620, in _read(filepath_or_buffer, kwds)
    617 _validate_names(kwds.get("names", None))
    619 # Create the parser.
--> 620 parser = TextFileReader(filepath_or_buffer, **kwds)
    622 if chunksize or iterator:
    623     return parser

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1620, in TextFileReader.__init__(self, f, engine, **kwds)
   1617     self.options["has_index_names"] = kwds["has_index_names"]
   1619 self.handles: IOHandles | None = None
-> 1620 self._engine = self._make_engine(f, self.engine)

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1880, in TextFileReader._make_engine(self, f, engine)
   1878     if "b" not in mode:
   1879         mode += "b"
-> 1880 self.handles = get_handle(
   1881     f,
   1882     mode,
   1883     encoding=self.options.get("encoding", None),
   1884     compression=self.options.get("compression", None),
   1885     memory_map=self.options.get("memory_map", False),
   1886     is_text=is_text,
   1887     errors=self.options.get("encoding_errors", "strict"),
   1888     storage_options=self.options.get("storage_options", None),
   1889 )
   1890 assert self.handles is not None
   1891 f = self.handles.handle

File ~/miniconda3/lib/python3.13/site-packages/pandas/io/common.py:873, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
    868 elif isinstance(handle, str):
    869     # Check whether the filename is to be opened in binary mode.
    870     # Binary mode does not support 'encoding' and 'newline'.
    871     if ioargs.encoding and "b" not in ioargs.mode:
    872         # Encoding
--> 873         handle = open(
    874             handle,
    875             ioargs.mode,
    876             encoding=ioargs.encoding,
    877             errors=errors,
    878             newline="",
    879         )
    880     else:
    881         # Binary mode
    882         handle = open(handle, ioargs.mode)

FileNotFoundError: [Errno 2] No such file or directory: 'table3.csv'

Figure 3: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.

Li Europan lingues es membres del sam familie. Lor separat existentie es un myth. Por scientie, musica, sport etc, litot Europa usa li sam vocabular. Li lingues differe solmen in li grammatica, li pronunciation e li plu commun vocabules. Omnicos directe al desirabilite de un nov lingua franca: On refusa continuar payar custosi traductores.

Your Second Perspective#

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.

The First Argument of Your Second Perspective#

Ongelijkheid en diefstal hebben niet veel met elkaar te maken in Europa en nijgt eerder naar dat landen met een lagere GINI (meer gelijkheid) meer diefstal hebben.

Hide code cell source
import pandas as pd
import plotly.express as px
import plotly.io as pio
pio.renderers.default = 'notebook'

# Load datasets
gini_df = pd.read_csv("gini_definitive.csv")
crime_df = pd.read_csv("europe_crime_definitive_per_100k.csv")

# Merge datasets on 'Country' and 'Year'
merged_df = pd.merge(crime_df, gini_df, on=["Country Name", "Year"])

merged_df = merged_df.rename(columns={"Value": "GINI"})

# Reshape crime data: convert Fraud and Theft columns into rows
long_df = merged_df.melt(
    id_vars=["Country Name", "Year", "GINI"],
    value_vars=['Theft'],
    var_name="CrimeType",
    value_name="Aantal Misdaden"
)



# Create scatter plot
fig = px.scatter(
    long_df,
    x="Aantal Misdaden",
    y="GINI",
    color="CrimeType",
    hover_data=["Country Name", "Year"],
    title="GINI vs. Number of Crimes (Fraud and Theft)"
)

fig.show()

Figure 4: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.

Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?

The Second Argument of Your Second Perspective#

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.

Hide code cell source
import pandas as pd
import plotly.express as px
import plotly.io as pio
pio.renderers.default = 'notebook'

# Load datasets
bank1_df = pd.read_csv("world_bank_definitive.csv")
bank_df = bank1_df[bank1_df['Indicator Name'] == "GDP per capita, PPP (constant 2021 international $)"]
crime1_df = pd.read_csv("europe_crime_definitive_per_100k.csv")

# Merge datasets on 'Country' and 'Year'
merged_df = pd.merge(crime_df, bank_df, on=["Country Name", "Year"])

merged_df = merged_df.rename(columns={"Value": "GDP per capita, PPP (constant 2021 international $)"})

# Reshape crime data: convert Fraud and Theft columns into rows
long_df = merged_df.melt(
    id_vars=["Country Name", "Year", "GDP per capita, PPP (constant 2021 international $)"],
    value_vars=['Burglary'],
    var_name="CrimeType",
    value_name="Aantal Misdaden"
)


# Create scatter plot
fig = px.scatter(
    merged_df,
    x="Burglary",
    y="GDP per capita, PPP (constant 2021 international $)",
    color="Burglary",
    hover_data=["Country Name", "Year"],
    title="GDP vs. Number of Crimes (Fraud and Theft)"
)

fig.show()

Figure 5: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.

Hide code cell source
import geopandas as gpd
import pandas as pd
import plotly.express as px
import random

# Read the shapefile using geopandas
shapefile_path = 'gadm41_NLD_shp/gadm41_NLD_1.shp'
data = gpd.read_file(shapefile_path)

# Sample data for demonstration
sample_data = {
    'Province': ['Drenthe', 'Flevoland', 'Fryslân', 'Gelderland', 'Groningen', 'Limburg', 'Noord-Brabant', 'Noord-Holland', 'Overijssel', 'Utrecht', 'Zeeland', 'NA'],
    'average_income': [random.randint(0, 1000000) for _ in range(12)]
}

# Merge the sample data with the shapefile data
merged_data = data.merge(pd.DataFrame(sample_data), left_on='NAME_1', right_on='Province')

# Exclude Zeeuwse meren and IJsselmeer regions
merged_data = merged_data[~merged_data['NAME_1'].isin(['Zeeuwse meren', 'IJsselmeer'])]

# Rename Fryslân to Friesland
merged_data.loc[merged_data['NAME_1'] == 'Fryslân', 'NAME_1'] = 'Friesland'

# Rename Noord-Brabant to Brabant
merged_data.loc[merged_data['NAME_1'] == 'Noord-Brabant', 'NAME_1'] = 'Brabant'

# Rename NA to Zuid-Holland
merged_data.loc[merged_data['NAME_1'] == 'NA', 'NAME_1'] = 'Zuid-Holland'

# Create the choropleth map using Plotly Express
fig6 = px.choropleth_mapbox(
    merged_data,
    geojson=merged_data.geometry.__geo_interface__,
    color='average_income',
    locations=merged_data.index,
    featureidkey="id",
    center={"lat": 52.1326, "lon": 5.2913},
    mapbox_style="carto-positron",
    zoom=5.5,
    color_continuous_scale='Blues',
    labels={'average_income': 'Average income'},
    opacity=0.75,
    hover_name='NAME_1',  # Update to 'NAME_1' for correct hover labels
    hover_data={'average_income': True, 'NAME_1': False},  # Update to 'NAME_1' for correct hover data
    custom_data=['average_income'],
)

fig6.update_traces(
    hovertemplate='<b>%{hovertext}</b><br>Average income: <b>%{customdata[0]}k</b><extra></extra>',
)

fig6.update_layout(
    title_text='Average income by Province in the Netherlands',
    margin={"r": 30, "t": 70, "l": 30, "b": 30},
    legend=dict(
        traceorder='normal',
        font=dict(size=10),
        bgcolor='rgba(255, 255, 255, 0.5)',
        bordercolor='rgba(0, 0, 0, 0.5)',
        borderwidth=0.5
    ),
    hoverlabel=dict(
        bgcolor='white',
        font_size=12,
        font_family='Arial',
    ),
    height=600
)

fig6.show()

Figure 6: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.

Reflection#

Curabitur non lacus ex. Maecenas at massa ultricies justo venenatis condimentum sed et eros. Ut vitae iaculis massa. Aenean vitae sagittis nibh. Aliquam pharetra dui suscipit purus dictum rutrum. Donec ultricies odio quis porttitor aliquet. Fusce sed nisl non velit rutrum commodo nec sed magna. Morbi non volutpat mi, cursus pulvinar dolor.

Nam sit amet volutpat sapien. Aenean eu mattis neque. Maecenas eget libero consequat, condimentum nulla luctus, fermentum lectus. Donec at enim sit amet dolor vestibulum faucibus. Vestibulum velit elit, faucibus ut mi sit amet, mollis rutrum eros. Ut ut lacinia ante, eu placerat ligula. Fusce quis convallis purus. Maecenas eget fringilla quam.

Proin ac sapien et lectus tempor dignissim a at arcu. Donec placerat aliquet odio, vel aliquam nibh tempus vel. Pellentesque non velit iaculis, porta metus sed, dictum augue. Aenean tempus gravida ullamcorper. Proin cursus fringilla turpis. Integer id lectus dignissim, ultrices metus vel, dictum quam. Suspendisse augue ligula, vestibulum ac nulla a, porta pharetra leo. Integer et pharetra lacus, in porttitor mauris. Cras sodales metus sit amet enim rhoncus sodales. Etiam orci enim, tincidunt eget arcu vel, gravida scelerisque lacus.

Work Distribution#

Curabitur non lacus ex. Maecenas at massa ultricies justo venenatis condimentum sed et eros. Ut vitae iaculis massa. Aenean vitae sagittis nibh. Aliquam pharetra dui suscipit purus dictum rutrum. Donec ultricies odio quis porttitor aliquet. Fusce sed nisl non velit rutrum commodo nec sed magna. Morbi non volutpat mi, cursus pulvinar dolor.

Nam sit amet volutpat sapien. Aenean eu mattis neque. Maecenas eget libero consequat, condimentum nulla luctus, fermentum lectus. Donec at enim sit amet dolor vestibulum faucibus. Vestibulum velit elit, faucibus ut mi sit amet, mollis rutrum eros. Ut ut lacinia ante, eu placerat ligula. Fusce quis convallis purus. Maecenas eget fringilla quam.

Proin ac sapien et lectus tempor dignissim a at arcu. Donec placerat aliquet odio, vel aliquam nibh tempus vel. Pellentesque non velit iaculis, porta metus sed, dictum augue. Aenean tempus gravida ullamcorper. Proin cursus fringilla turpis. Integer id lectus dignissim, ultrices metus vel, dictum quam. Suspendisse augue ligula, vestibulum ac nulla a, porta pharetra leo. Integer et pharetra lacus, in porttitor mauris. Cras sodales metus sit amet enim rhoncus sodales. Etiam orci enim, tincidunt eget arcu vel, gravida scelerisque lacus.

References#

De Courson, B., Nettle, D. Why do inequality and deprivation produce high crime and low trust?. Sci Rep 11, 1937 (2021). https://doi.org/10.1038/s41598-020-80897-8